﻿package com.student.util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;


/**
 * 生成Excel文件
 * 
 * @author 李伟豪
 */
public class CreatExcel {

	// 列名
	// public static Map<String,Integer> columnNameMap = new HashMap<String , Integer>();

	/**
	 * 生成Excel文件
	 * 
	 * @param title
	 *            表里的标题
	 * @param name
	 *            传入表名name
	 * @param list
	 *            传入list (list中存放的是一个 String[] 集合，即是需要把对象存入,要求String[] 各个数组的长度要一致)
	 * @param url
	 *            保存的路径 返回生成的文件名
	 */
	public static String createExcel(String title, String name, List list, String url) throws Exception {
		WritableWorkbook workbook = null;
		String worksheet = name;// 输出的excel文件工作表名

		// 标题格式
		WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 15, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLUE2); // 定义格式 字体 下划线 斜体 粗体
																																								// 颜色
		WritableCellFormat wcf = new WritableCellFormat(wf); // 单元格定义
		wcf.setBackground(jxl.format.Colour.WHITE); // 设置单元格的背景颜色
		wcf.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式

		// 列名格式
		WritableFont wf2 = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 粗体 颜色
		WritableCellFormat wcf2 = new WritableCellFormat(wf2); // 单元格定义
		wcf2.setBackground(jxl.format.Colour.BLUE); // 设置单元格的背景颜色
		wcf2.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式

		/**
		 * String uri = Thread.currentThread().getContextClassLoader().getResource("/")+""; String str[] = uri.split("\\/"); String newUrl = ""; for(int j = 1 ; j < str.length-2;
		 * j++){ newUrl = newUrl + str[j]+"/"; }//获取路径
		 * 
		 * newUrl=newUrl.substring(0,newUrl.lastIndexOf("/"));
		 * 
		 * String root=newUrl+url;
		 */
		// 获取路径
		String realUrl = Thread.currentThread().getContextClassLoader().getResource("/") + "";
		String str[] = realUrl.split("\\/");
		String newUrl = "";
		for (int j = str.length - 3; j < str.length - 2; j--) {
			if (str[j].matches("[A-Za-z]{1}\\:")) {
				newUrl = str[j] + newUrl + "/";
				break;
			}
			if (str[j].endsWith("file:")) {
				newUrl = newUrl + "/";
				break;
			}
			newUrl = "/" + str[j] + newUrl;
		}
		realUrl = newUrl;
		realUrl = realUrl.substring(0, realUrl.length() - 1);
		String root = realUrl + url;
		root = URLDecoder.decode(root, "utf-8");
		// //如果文件夹不存在，则创建 用于绝对路径
		// File dirFile=new File(url);
		// boolean bFile=dirFile.exists();
		// if( bFile == false )
		// {
		// bFile = dirFile.mkdir();
		// }
		//		
		// String root=url;//获取路径

		Date date = new Date(); // 获得日期
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH：mm：ss");// 用汉字输入法的“：”来替代英文的":"，此处无法用英文的
		String today = f.format(date);
		String fileName = name + ".xls"; // 生成的文件名

		OutputStream os = new FileOutputStream(root + "/" + fileName);
		try {
			/*****避免内存溢出问题的出现，需将setUseTemporaryFileDuringWrite设为true***/
			WorkbookSettings setting=new WorkbookSettings();
			setting.setUseTemporaryFileDuringWrite(true);
			
			workbook = Workbook.createWorkbook(os,setting);
	
			workbook.setColourRGB(Colour.BLUE2, 0x5c, 0xb0, 0xff);// 自定义颜色
			workbook.setColourRGB(Colour.BLUE, 0xbc, 0xdf, 0xff);// 自定义颜色
			int pageCount = 60000;// 每个表的行数
			int n = list.size() / pageCount;// 控制具体的表数,
			// system.out.println(n);
			for (int k = 0; k <= n; k++) {
				WritableSheet sheet = workbook.createSheet(worksheet + (k + 1), k); // 添加第一个工作表
				// sheet.addCell(new Label(0, 0, title, wcf)); //表头
				String[] row = (String[]) list.get(0);
				// sheet.mergeCells(0, 0, row.length-1, 0); // 合并单元格
				//			  
				Label label = null;
				String[] rows = null;
				// //标题
				rows = (String[]) list.get(0); // 获得第0行
				for (int j = 0; j < rows.length; j++) {
					label = new Label(j, 0, rows[j], wcf2); // 把标题放到第2行
					sheet.addCell(label);
				}

				for (int i = 1 + k * pageCount; i < list.size() && i <= (k + 1) * pageCount; i++) {
					// for(int i=k*pageCount;i<list.size() && i<=(k)*pageCount;i++){
					rows = (String[]) list.get(i); // 获得第i行
					for (int j = 0; j < rows.length; j++) {

						sheet.setColumnView(j, 18);// 设置第i列的宽度为18
						// Label(列号,行号 ,内容 )
						// label = new Label(j, (i-k*pageCount+1), rows[j]); //把内容放到第j行
						label = new Label(j, (i - k * pageCount), rows[j]); // 把内容放到第j行
						sheet.addCell(label);
					}
				}

			}
			workbook.write();// 写出文件
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (workbook != null) {
					workbook.close();
					os.close();
				}
			} catch (WriteException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return fileName;
	}

	/**
	 * 读取Excel文件 传入 文件地址 url ，文件名 fileName 返回 list<String[]> 返回null 则代表读不到数据
	 */
	public static List<String[]> readExcel(String url, String fileName) throws Exception {
		String xlspath = url + "/" + fileName; // 拼按文件绝对路径
		Workbook book = null;
		try {
			// 读Excel文件
			book = Workbook.getWorkbook(new java.io.File(xlspath));
		} catch (BiffException ex) {
			return null;
		} catch (IOException ex) {
			return null;
		} catch (Exception e) {
			return null;
		}
		// get sheet object
		int sheetId = 0; // 控制当前操作的工作表序号
		int sheetCount = book.getNumberOfSheets(); // 总表数
		List<String[]> list = new ArrayList<String[]>(); // 创建一个List集合
		while (sheetId < sheetCount) {// 可循环读取多张表
			Sheet sheet = book.getSheet(sheetId); // 读取工作表
			int rowcnt = sheet.getRows();
			int i;
			/*
			 * //保存列名 for(i = 0;i<sheet.getColumns();i++){ Cell cell = sheet.getCell(i,0); String result = cell.getContents(); result = result.replace('\n', ' '); result =
			 * result.trim(); columnNameMap.put(result, i); }
			 */

			for (i = 1; i < rowcnt; i++) {
				// //如果准考证号为空，刚继续下一个循环
				// if(sheet.getCell(0, i)==null || sheet.getCell(0, i).getContents()==""){
				// System.out.println(sheet.getCell(0,i));
				// continue;
				// }
				// //如果身份证为空，刚继续下一个循环
				// if(sheet.getCell(1, i)==null || sheet.getCell(1, i).getContents()==""){
				// System.out.println(sheet.getCell(1,i));
				// continue;
				// }

				String[] str = new String[sheet.getColumns()]; // 确定数组长度
				for (int j = 0; j < sheet.getColumns(); j++) {
					Cell cell = sheet.getCell(j, i); // 读取数据
					String result = "";
					if (cell.getType() == CellType.DATE) { // 如果是日期
						DateCell dc = (DateCell) cell;
						Date date = dc.getDate();
						result = new SimpleDateFormat("yyyy-MM-dd").format(date); // 格式化日期
					} else {
						result = cell.getContents();
					}
					result = result.replace('\n', ' ');
					result = result.trim();
					str[j] = result;
				}
				list.add(str);
			}
			sheetId++;// 第二张表
		}
		book.close();
		return list;
	}

	
	public static String createOtherExcel(String title, String name, List list, String url) throws Exception {
		WritableWorkbook workbook = null;
		String worksheet = name;// 输出的excel文件工作表名

		// 标题格式
		WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 15, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLUE2); // 定义格式 字体 下划线 斜体 粗体
																																								// 颜色
		WritableCellFormat wcf = new WritableCellFormat(wf); // 单元格定义
		wcf.setBackground(jxl.format.Colour.WHITE); // 设置单元格的背景颜色
		wcf.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式

		// 列名格式
		WritableFont wf2 = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 粗体 颜色
		WritableCellFormat wcf2 = new WritableCellFormat(wf2); // 单元格定义
		wcf2.setBackground(jxl.format.Colour.BLUE); // 设置单元格的背景颜色
		wcf2.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式

		// 获取路径
		String realUrl = Thread.currentThread().getContextClassLoader().getResource("/") + "";
		String str[] = realUrl.split("\\/");
		String newUrl = "";
		for (int j = str.length - 3; j < str.length - 2; j--) {
			if (str[j].matches("[A-Za-z]{1}\\:")) {
				newUrl = str[j] + newUrl + "/";
				break;
			}
			if (str[j].endsWith("file:")) {
				newUrl = newUrl + "/";
				break;
			}
			newUrl = "/" + str[j] + newUrl;
		}
		realUrl = newUrl;
		realUrl = realUrl.substring(0, realUrl.length() - 1);
		String root = realUrl + url;
		root = URLDecoder.decode(root, "utf-8");

		Date date = new Date(); // 获得日期
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH：mm：ss");// 用汉字输入法的“：”来替代英文的":"，此处无法用英文的
		String today = f.format(date);
		String fileName = today + " " +name + ".xls"; // 生成的文件名

		OutputStream os = new FileOutputStream(root + "/" + fileName);
		try {
			workbook = Workbook.createWorkbook(os);
			workbook.setColourRGB(Colour.BLUE2, 0x5c, 0xb0, 0xff);// 自定义颜色
			workbook.setColourRGB(Colour.BLUE, 0xbc, 0xdf, 0xff);// 自定义颜色
			int pageCount = 60000;// 每个表的行数
			int n = list.size() / pageCount;// 控制具体的表数,
			for (int k = 0; k <= n; k++) {
				WritableSheet sheet = workbook.createSheet(worksheet + (k + 1), k); // 添加第一个工作表
				Label label = null;
				String[] rows = null;
				// //标题
				rows = (String[]) list.get(0); // 获得第0行
				for (int j = 0; j < rows.length; j++) {
					label = new Label(j, 0, rows[j], wcf2); // 把标题放到第2行
					sheet.addCell(label);
				}

				for (int i = 1 + k * pageCount; i < list.size() && i <= (k + 1) * pageCount; i++) {
					// for(int i=k*pageCount;i<list.size() && i<=(k)*pageCount;i++){
					rows = (String[]) list.get(i); // 获得第i行
					for (int j = 0; j < rows.length; j++) {

						sheet.setColumnView(j, 18);// 设置第i列的宽度为18
						// Label(列号,行号 ,内容 )
						// label = new Label(j, (i-k*pageCount+1), rows[j]); //把内容放到第j行
						label = new Label(j, (i - k * pageCount), rows[j]); // 把内容放到第j行
						sheet.addCell(label);
					}
				}

			}
			workbook.write();// 写出文件
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (workbook != null) {
					workbook.close();
					os.close();
				}
			} catch (WriteException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return fileName;
	}

	
//	/**
//	 * 针对招就处生成Excel文件
//	 * 
//	 * @param title
//	 *            表里的标题
//	 * @param name
//	 *            传入表名name
//	 * @param list
//	 *            传入list (list中存放的是一个 EnrollmentStatisticsVO 集合，即是需要把对象存入)
//	 * @param subjectType           
//	 *            科类名称的集合
//	 * @param url
//	 *            保存的路径 返回生成的文件名
//	 */
//	public static String Create4Enrollment(String title, String name, List<EnrollmentStatisticsVO> list, String url) throws Exception {
//		WritableWorkbook workbook = null;
//		String worksheet = name;// 输出的excel文件工作表名
//
//		// 标题格式
//		WritableFont wf = new WritableFont(WritableFont.createFont("宋体"), 15, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLUE2); // 定义格式 字体 下划线 斜体 粗体
//																																								// 颜色
//		WritableCellFormat wcf = new WritableCellFormat(wf); // 单元格定义
//		wcf.setBackground(jxl.format.Colour.WHITE); // 设置单元格的背景颜色
//		wcf.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式
//
//		// 列名格式
//		WritableFont wf2 = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 粗体 颜色
//		WritableCellFormat wcf2 = new WritableCellFormat(wf2); // 单元格定义
//		wcf2.setBackground(jxl.format.Colour.BLUE); // 设置单元格的背景颜色
//		wcf2.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式
//
//		//普通文本格式
//		WritableFont wf3 = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLACK);
//		WritableCellFormat wcf3 = new WritableCellFormat(wf3);// 单元格定义
//		wcf3.setAlignment(jxl.format.Alignment.CENTRE);// 设置对齐方式
//		
//		// 获取路径
//		String realUrl = Thread.currentThread().getContextClassLoader().getResource("/") + "";
//		String str[] = realUrl.split("\\/");
//		String newUrl = "";
//		for (int j = str.length - 3; j < str.length - 2; j--) {
//			if (str[j].matches("[A-Za-z]{1}\\:")) {
//				newUrl = str[j] + newUrl + "/";
//				break;
//			}
//			if (str[j].endsWith("file:")) {
//				newUrl = newUrl + "/";
//				break;
//			}
//			newUrl = "/" + str[j] + newUrl;
//		}
//		realUrl = newUrl;
//		realUrl = realUrl.substring(0, realUrl.length() - 1);
//		String root = realUrl + url;
//		root = URLDecoder.decode(root, "utf-8");
//
//		Date date = new Date(); // 获得日期
//		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd_hh_mm_ss");// 用汉字输入法的“：”来替代英文的":"，此处无法用英文的
//		String today = f.format(date);
//		String fileName = name + ".xls"; // 生成的文件名
//
//		OutputStream os = new FileOutputStream(root + "/" + fileName);
//		try {
//			workbook = Workbook.createWorkbook(os);
//			workbook.setColourRGB(Colour.BLUE2, 0x5c, 0xb0, 0xff);// 自定义颜色
//			workbook.setColourRGB(Colour.BLUE, 0xbc, 0xdf, 0xff);// 自定义颜色
//			int pageCount = 60000;// 每个表的行数
//			int n = list.size() / pageCount;// 控制具体的表数,
//			
//			
//			final int line = 2;//内容行数
//			for (int k = 0; k <= n; k++) {
//				WritableSheet sheet = workbook.createSheet(worksheet + (k + 1), k); // 添加第一个工作表
//				sheet.addCell(new Label(0, 0, title, wcf)); //表头
//				sheet.mergeCells(0, 0, EnrollmentStatisticsVO.subjectType.size() * 4, 0); // 合并单元格
//
//				//在excel第二行插入标题
//				for(int j = 0;j<EnrollmentStatisticsVO.subjectType.size();j++){
//					sheet.addCell(new Label(1+j*4,1,EnrollmentStatisticsVO.subjectType.get(j),wcf2));
//					sheet.mergeCells(1+j*4,1, (j+1)*4, 1);//合并单元格
//				}
//				
//				
//				// Label(列号,行号 ,内容 )
//				Label label = null;
//				//获取每个学院的信息
//				for(int i = 0 ; i<list.size();i++){
//					EnrollmentStatisticsVO enrollmentStatisticsVO = list.get(i);//获取vo
//					int enLen = line + i * (2 + enrollmentStatisticsVO.getDataMap().size());//每个学院的名称的第一行
//					label = new Label(0,enLen,enrollmentStatisticsVO.getCollegeName());//学院名称
//					sheet.mergeCells(0, enLen, 0,(i+1) * (2 + enrollmentStatisticsVO.getDataMap().size()));//合并
//					
//					int len = enrollmentStatisticsVO.getDataMap().size();
//					for(int j=0;j<len;j++){
//						label = new Label(2+j*4,enLen,"已到人数");
//						sheet.addCell(label);
//						
//						label = new Label(3+j*4,enLen," 未到人数");
//						sheet.addCell(label);
//						
//						label = new Label(4+j*4,enLen,"报到率");
//						sheet.addCell(label);
//						
//						
//					}
//					Set<Entry<String, String[]>> set = enrollmentStatisticsVO.getDataMap().entrySet();
//					int l = 0;
//					for (Iterator<Map.Entry<String, String[]>> it = set.iterator(); it.hasNext();) {
//			            Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) it.next();
//			            label = new Label(1+l*4,enLen+l+1,entry.getKey());
//			            sheet.addCell(label);
//			            
//			            String[] nums = entry.getValue();
//			            
//			            //已到人数
//			            label = new Label(2+l*4,enLen+l+1,nums[0]);
//			            sheet.addCell(label);
//			            
//			            //未到人数
//			            label = new Label(3+l*4,enLen+l+1,nums[1]);
//			            sheet.addCell(label);
//			            
//			            //报到率
//			            label = new Label(4+l*4,enLen+l+1,nums[2]);
//			            sheet.addCell(label);
//			            l++;
//			            System.out.println(entry.getKey() + "--->" + entry.getValue());
//			        }
//					
//				}
//				
////				//			  
////				Label label = null;
////				String[] rows = null;
////				// //标题
////				rows = list.get(0); // 获得第1个
////				for (int j = 0; j < rows.length; j++) {
////					label = new Label(j, 0, rows[j], wcf2); // 把标题放到第2行
////					sheet.addCell(label);
////				}
////
////				for (int i = 1 + k * pageCount; i < list.size() && i <= (k + 1) * pageCount; i++) {
////					// for(int i=k*pageCount;i<list.size() && i<=(k)*pageCount;i++){
////					rows = (String[]) list.get(i); // 获得第i行
////					for (int j = 0; j < rows.length; j++) {
////
////						sheet.setColumnView(j, 18);// 设置第i列的宽度为18
////						// Label(列号,行号 ,内容 )
////						// label = new Label(j, (i-k*pageCount+1), rows[j]); //把内容放到第j行
////						label = new Label(j, (i - k * pageCount), rows[j]); // 把内容放到第j行
////						sheet.addCell(label);
////					}
////				}
//
//			}
//			workbook.write();// 写出文件
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		} catch (RowsExceededException e) {
//			e.printStackTrace();
//		} catch (WriteException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				if (workbook != null) {
//					workbook.close();
//					os.close();
//				}
//			} catch (WriteException e) {
//				e.printStackTrace();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}
//		return fileName;
//	}

}
